package com.gao.pool;

import java.util.concurrent.*;

public class Demo01 {
    public static void main(String[] args) {
//        单个线程
//        ExecutorService threadPool = Executors.newSingleThreadExecutor();
//        创建一个固定的线程池的大小
//        ExecutorService threadPool = Executors.newFixedThreadPool(5);
//        可伸缩
//        ExecutorService threadPool = Executors.newCachedThreadPool();

//        自定义线程池
//        最大线程池如何定义？
//        1、CPU密集型，几核，就是几，可以保持CPU的效率最高！
//        2、IO密集型，判断你程序中十分耗IO的线程数量并两倍大于
//        例如15个大型任务，且都很占用IO，那么就需要30个线程

//        获取CPU核数
        System.out.println(Runtime.getRuntime().availableProcessors());

        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
//                最小线程数
                2,
//                最大线程数
                5,
//                超时没有人调用就释放
                3,
//                时间单位
                TimeUnit.SECONDS,
//                阻塞队列（等候区）
                new LinkedBlockingQueue<>(3),
//                线程工厂
                Executors.defaultThreadFactory(),
//                拒绝策略
                new ThreadPoolExecutor.DiscardOldestPolicy());

        try {
//            最大承载：queue + max
//            超过最大承载，抛出异常 RejectedExecutionException
            for (int i = 1; i <= 9; i++) {
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "\t 办理业务");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
//            线程池用完，程序结束，关闭线程池
            threadPool.shutdown();
        }



    }
}
